home *** CD-ROM | disk | FTP | other *** search
/ EuroCD 3 / EuroCD 3.iso / Programming / Python-1.4 / Docs / Amiga / ARexx_module < prev    next >
Text File  |  1998-06-24  |  16KB  |  405 lines

  1.  
  2. ***************************************************************************
  3.  
  4.                            PYTHON AREXX SUPPORT
  5.  
  6.                          ARexx and arexxll modules
  7.     
  8.                      by Irmen de Jong - ijong@gak.nl
  9.  
  10.                           Last update: 17-Nov-96
  11.  
  12.                                BETA VERSION
  13.  
  14. ***************************************************************************
  15.  
  16. As  this  document  describes  the  BETA VERSION of the ARexx support there
  17. might  be  changes  to what is described below.  This depends on bugs found
  18. and  suggestions  received.   So please:  test the ARexx support and let me
  19. hear any problems/bugs/suggestions (ijong@gak.nl).
  20.  
  21. NOTE:  The ARexx support relies on the dos.library support; please read the
  22. documentation on that subject first (Dos_module, python module dos.py).
  23.  
  24.  
  25. ***************************************************************************
  26.  
  27.                               MODULE: arexxll
  28.  
  29.                             File: N/A (builtin)
  30.  
  31. ***************************************************************************
  32.  
  33. This module provides the lowlevel ARexx functionality.
  34.  
  35. IMPORTANT:   It  is  DISCOURAGED to use this module directly, use the arexx
  36. module instead (see below).  This is because it is quite likely that in the
  37. future  some things will be changed in this module.  Furthermore, using the
  38. arexx module instead is much easier.
  39.  
  40.  
  41. This module defines:
  42.  
  43.   error        - The exception that will be raised when an
  44.           error occurs related to ARexx. ('arexx.error')
  45.  
  46.   port()    - Function returning a new lowlevel ARexx port object.
  47.           The lowlevel ARexx port object is NOT DOCUMENTED.
  48.           Use a higher-level object from the ARexx module instead.
  49.  
  50.   errorstring()    - Returns string associated with arexx error number:
  51.           str = arexxll.errorstring(number)
  52.  
  53.  
  54. ARexx message objects
  55. ~~~~~~~~~~~~~~~~~~~~~
  56. This  module  also implements the ARexx message object.  A message arriving
  57. at  a  ARexx  port  will  be  returned  as  a  ARexx  message  object (type
  58. 'arexxmsg'), which has the following attributes:
  59.  
  60.   reply()    - replies the message with the given results.
  61.           See rc, rc2 and result.  Each message must be replied to!
  62.           Messages which are deleted will be replied automatically,
  63.           if this is not yet done.
  64.   setvar()    - sets ARexx variable for result: setvar('varname','value')
  65.   getvar()    - get value of ARexx variable from caller's environment
  66.  
  67.   wantresult    - does the message require a result string? (int/bool)
  68.   msg        - the message itself (string)
  69.   rc        - result code for reply() (int)
  70.   rc2        - secondary (error) result (string or None)
  71.   result    - result string (string or None)
  72.  
  73. For  details  on  passing  results to the calling application/ARexx script,
  74. refer  to  the  topic  below,  "HOW  RESULTS ARE PASSED BACK TO THE CALLING
  75. APPLICATION".
  76.  
  77.  
  78.  
  79. ***************************************************************************
  80.  
  81.                                MODULE: ARexx
  82.  
  83.                               File: ARexx.py
  84.  
  85. ***************************************************************************
  86.  
  87. This  module  implements  the  Python  ARexx support classes and such.  You
  88. should  use  this module and not arexxll directly, if your code must remain
  89. compatible with future versions.
  90.  
  91. This module defines:
  92.  
  93.   error        - The exception that will be raised when an
  94.           error occurs related to ARexx. This is the same
  95.           exception as the one in the arexxll module.
  96.           ('arexx.error')
  97.  
  98.   errorstring()    - Returns string associated with arexx error number:
  99.           str = arexxll.errorstring(number)
  100.  
  101.   RC_OK        - ARexx 'success' return code (0)
  102.   RC_WARN    - ARexx 'warning' return code (5)
  103.   RC_ERROR    - ARexx 'error' return code (10)
  104.   RC_FATAL    - ARexx 'severe failure' return code (20)
  105.  
  106.  
  107. class `port'
  108. ~~~~~~~~~~~~
  109. This  is  the message port abstraction.  Don't create objects of this class
  110. directly!   Instead,  use  one  of  the  derived  classes  `privateport' or
  111. `publicport'.   This  class  is  used  as base class for other port classes
  112. only.
  113.  
  114.  
  115. class `privateport' (derived from `port')
  116. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  117. This  is  the  private  ARexx port abstraction.  The port is a private one,
  118. which  means  it  has no name (and is therefore not public) and can only be
  119. used to send ARexx messages to other ports (which are public).
  120.  
  121. Privateport objects are created as follows:
  122.     p = arexx.privateport()
  123.  
  124. Attributes of privateport objects:
  125.   port        - The lowlevel ARexx port. DON'T TOUCH.
  126.   signal    - The AmigaDOS signal mask of the port.
  127.  
  128. Methods defined on privateport objects:
  129.   close()
  130.     Close the port.
  131.   send(to,cmd,async=0)
  132.     Send a ARexx message to another port. Currently, all pending
  133.         messages (if any) are removed before the message is sent.
  134.         to = name of port to send message to. (string)
  135.         cmd = command to send (string)
  136.         async = Asynchronous processing? Default=no (0).
  137.     Asynchronous sends will not return a result, but synchronous
  138.     sends do, so you should call this method like:
  139.         result = p.send('REXX','\"return 4*8',0)
  140.     which will put '32' in result. Errors are returned as a 2-tuple
  141.     argument (rc,rc2) to the error exception.
  142.   flush()
  143.     Remove all pending messages (if any) from the port.
  144.   wait()
  145.     private-- behavior not documented for private port objects.
  146.         Don't use it.
  147.   getmsg()
  148.     private-- behavior not documented for private port objects.
  149.         Don't use it.
  150.  
  151.  
  152. class `publicport' (derived from `port')
  153. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  154. This  is the public ARexx port abstraction.  The port is public, so it must
  155. have  a  name.  It can be used for receiving ARexx messages and for sending
  156. them.  A publicport is the core of the ARexx host class, see below.
  157.  
  158. Publicport objects are created as follows:
  159.     p = arexx.publicport()        # default portname PYTHON
  160.     p = arexx.publicport('FOOBAR')    # portname FOOBAR
  161.  
  162.     When a port with the desired name already exists, sequence numbers
  163.     are automatically appended to the name (PYTHON.1, PYTHON.2 etc).
  164.  
  165.     When you provide a name, it is converted to uppercase.
  166.     If it is not a valid ARexx port name, error will be raised.
  167.     Valid portnames consist of uppercase letters, digits, decimal
  168.     points and underscores, and no other characters.
  169.     
  170.  
  171. Attributes of publicport objects:
  172.   port        - The lowlevel ARexx port. See arexxll module.
  173.   signal    - The AmigaDOS signal mask of the port.
  174.   name        - The actual port name.
  175.  
  176. Methods defined on publicport objects:
  177.   close()
  178.     Close the port.
  179.   send(to,cmd,async=0)
  180.     See privateport.
  181.   flush()
  182.     See privateport.
  183.   wait()
  184.     Wait until a message arrives. Currently the wait can be aborted
  185.     with a ^C signal. This behavior might change in the future.
  186.   getmsg()
  187.     Receive a message. The message will be removed from the port,
  188.     and it is returned as `message' object (see below).
  189.     Returns None if no messages have arrived, i.e. this operation
  190.         is non-blocking.
  191.  
  192.  
  193.  
  194. class `host' (derived from `publicport')
  195. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  196.  
  197. This   is  the  important  one:   this  class  is  a  complete  ARexx  host
  198. abstraction!   It  contains  all  code  for  setting up the host, receiving
  199. messages,  parsing  the commands and dispatching automatically.  Setting up
  200. your own ARexx host has never been easier.
  201.  
  202. An ARexx host is created as follows:
  203.  
  204.     h = arexx.host()        # default portname 'PYTHON'
  205.     h = arexx.host('FOOBAR')    # custom port name
  206.     h = arexx.host('FOOBAR',cmds)    # custom port name + initial cmds
  207.  
  208.     The port name is used as a public port name. See the notes on
  209.     public port names above, at class `publicport'.
  210.     The third call above supplies an initial list of commands for this
  211.     host. You may also install the list later using the setcommands
  212.     member function.
  213.  
  214. The host has one default command built-in:
  215.  
  216.     HELP COMMAND,STEM/K,VAR/K
  217.  
  218. This  command  works  as  follows.   Without  args  it  returns  the set of
  219. available  commands  like this:  <#commands> <cmd1> ...  <cmdN>.  A COMMAND
  220. argument  gets  help  on  the  specified  command:  the command template is
  221. returned.   The  result is usually put into the RESULT variable.  RC is the
  222. error  code,  RC2  is  the  error string (if any).  Use the VAR argument to
  223. specify a variable yourself to put the result into, instead of RESULT.  Use
  224. the STEM argument to get the result in a slightly different format:
  225.  
  226.     HELP STEM X.
  227.  
  228. gets  the  list  of commands like this:  X.COUNT will contain the number of
  229. result  values (i.e.  the number of commands), where X.1, X.2, X.3...  will
  230. contain the individual results (i.e.  the commands).
  231.  
  232. The  default  help  service  is  implemented  in  the std_help_func command
  233. function, which can be found in the ARexx module.
  234.  
  235.  
  236. Attributes of host objects:
  237.  
  238.   commands    - dictionary of installed ARexx commands. Keys are the
  239.           commands, data is tuple of ArgParser object for the
  240.           template and the command function to call.
  241.   cmderror    - error string for calling app when command is unknown.
  242.           Default is 'Unknown command'.
  243.   catch        - will exceptions in ARexx commands be catched or not (0/1)
  244.           Default is 0; don't catch. Beware: the calling app may
  245.           freeze if your ARexx command raises an exception (because
  246.           the message is not replied to). Just exit Python and
  247.           all will be fine.
  248.   name        - see publicport class
  249.   port        - see publicport class
  250.   signal    - see publicport class
  251.  
  252. Methods defined on host objects:
  253.  
  254.   close()
  255.     Close the ARexx port (shutdown the host)
  256.     You can also just delete the host object.
  257.  
  258.   setcommands(cmdlist)
  259.     Specify a list of commands for this host.
  260.     cmdlist = list of commands (4-tuple: command, template,
  261.     defaults, function. See setcommand.)
  262.  
  263.   setcommand(cmd,templ,defaults,func)
  264.     Install a single command for this host
  265.     cmd = the command, for instance 'HELP'. Uppercase please.
  266.     templ = the argument template, ReadArg() format, for instance
  267.             'COMMAND,STEM/K,VAR/K,AMOUNT/N'. See also the ArgParser
  268.             class from the `dos' module. You can also specify None,
  269.         then no argument parser will be associated with this
  270.             command. This means that all arguments are passed straight
  271.         to the command function. This can be used for creating ARexx
  272.         commands with non-ReadArg() style arguments.
  273.         Use the empty string if you want the command to have NO
  274.             arguments! This is different than None! 
  275.     defaults = either None or a dictionary which specifies for some
  276.                keywords in the template what the default values are, if
  277.                the user doesn't specify them. Example: {'AMOUNT': 10}.
  278.                If you use None, some sensible values are chosen,
  279.                depending on the types of the keywords.
  280.     func = the command function which is associated with this command.
  281.            See the topic, "HOW TO IMPLEMENT COMMAND FUNCTIONS".
  282.  
  283.   setdefaults(cmd,defaults)
  284.     Install (new) default values for a command's argument template
  285.     cmd = the command
  286.     defaults = see above (setcommand)
  287.  
  288.   defaults(cmd)
  289.     Query default values for a command's argument template
  290.     cmd = the command
  291.  
  292.   catchExceptions(flag)
  293.     flag= int/boolean argument:
  294.      0 : don't catch exceptions. When an exception occurs in an
  295.          ARexx command function, your program aborts (=default).
  296.      1 : catch exceptions. When an exception occurs in an Arexx command
  297.          function, it will be passed back to the calling application as
  298.          an error string, while your python program continues.
  299.   dispatch()
  300.     When a message is present, process it. The arguments will
  301.     be parsed according  to the command's template and the
  302.     correct command function is executed. The following
  303.     return codes are defined:
  304.       -1 : there were no messages
  305.        0 : (false) a command function returned false, i.e. it failed
  306.        1 : message processed ok, command function executed ok
  307.  
  308.   flush()
  309.     Process each pending message untill there are none left.
  310.   run()
  311.     Enter a wait/dispatch loop until one of the command
  312.     functions returns false (0) or an error occurs.
  313.  
  314.  
  315.  
  316.  
  317. HOW TO IMPLEMENT COMMAND FUNCTIONS
  318. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  319. They must be declared like this:
  320.     def cmd_func(host,msg,cmd,args)
  321. where
  322.     host    = ARexx host object invoking this function
  323.     msg    = the ARexx message which was received
  324.     cmd    = the command which was called (string)
  325.     args    = dictionary of arguments and their valued provided for
  326.           this command. See also ArgParser class from `dos' module.
  327.           Optionally, this is a regular string which contains
  328.           the argument line unchanged. This is the case when the
  329.           command has been added without an argument template.
  330.           See the setcommand memberfunction of the host class.
  331.  
  332. They  must  return  either 1 (true) or 0 (false).  0 indicates an error and
  333. will  cause  the  `run' memberfunction of your ARexx host to abort (because
  334. `dispatch' returns 0).
  335.  
  336.  
  337. HOW RESULTS ARE PASSED BACK TO THE CALLING APPLICATION
  338. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  339. Lets call the message you've received from your ARexx host `M'.  First, you
  340. might  want to check the value of M.wantresult.  If it is zero (false), the
  341. calling  app  is not expecting any results (if it's an ARexx script, it has
  342. not  set  `options  results').  If it is non-zero (true) the calling app is
  343. possibly expecting a result value (Arexx script has set `options results').
  344. Ofcourse  your  function  should  eventually decide if it needs to return a
  345. result value.
  346.  
  347. M.rc  must  be  set  to  the  appropriate  ARexx return code (one of RC_OK,
  348. RC_WARN, RC_ERROR and RC_FATAL).  By default it is set to RC_OK (0).
  349.  
  350. If  M.rc  is  RC_OK  (0), put the result string in M.result.  M.rc2 remains
  351. unchanged  (None).   If  you  must  return  results in other variables, use
  352. M.setvar  to  set them.  See the implementation of the default HELP command
  353. for  how  this  can  be  done (the user can ask for the result to be put in
  354. another variable, instead of RESULT).
  355.  
  356. If  M.rc  is  not  RC_OK  (0),  you should put a secondary result string in
  357. M.rc2.  Usually this will be a string describing what went wrong.  M.result
  358. does  not  need  to  have  a  value  in this case.  Other variables (set by
  359. M.setvar) can still have a result value.
  360.  
  361. When  you're  done, you must reply the message.  This can be done by either
  362. deleting  the  message  or  (better) by invoking M.reply() explicitly.  The
  363. latter is not necessary but then you must make sure M gets deleted on time,
  364. otherwise the message is not replied to, and the calling app will freeze.
  365.  
  366.  
  367. HOW THE CALLING APPLICATION GETS RESULTS BACK FROM A CALL
  368. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  369. If  you require results and you are using an ARexx script, you should issue
  370. the `options results' command first.  The following result variables exist:
  371.  
  372.   RC    - primary return code
  373.   RC2    - secondary result (error)string, if RC != 0
  374.   RESULT - regular result value.
  375.  
  376. If  RC is 0, all went well and RESULT will contain the result, if any.  RC2
  377. has no value in this case.
  378.  
  379. If  RC  is  not  0, there was some error and RC2 will contain the secondary
  380. result string, this is usually a string describing what went wrong.  RESULT
  381. has no value in this case.
  382.  
  383. Sometimes it is possible to get the results in other variables than RESULT.
  384. This  depends  on  the  function  you're calling.  The documentation of the
  385. function   should  say  exactly  what  to  expect  from  it.   The  default
  386. implementation  of  the HELP command is such a function:  you can specify a
  387. variable yourself instead of relying on RESULT.
  388.  
  389.  
  390. The `std_help_func' utility function
  391. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  392. This is the default command function connected with the `HELP' command.  It
  393. might be a good example of implementing a command function.  You might want
  394. to  write  your  own help function, for example to give more extensive help
  395. descriptions.   Just  use  the  `setcommand'  memberfunction to replace the
  396. existing `HELP' command.  Do NOT change the source code of the default help
  397. function!!!
  398.  
  399. The `std_debug_func' utility function
  400. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  401. When  you  use  this  function as a command function for a command, it will
  402. print  out  some  debug  information  to  the screen and reply the command.
  403. Useful for testing or for unfinished commands.
  404.  
  405.